package com.djbx.points.member.mq;

import com.djbx.points.member.api.dto.MemberInDTO;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@Component
public class MQProducerService {

//	@Value("${rocketmq.producer.send-message-timeout}")
//    private Integer messageTimeOut;

    /**
     * 建议正常规模项目统一用一个TOPIC
     */
    private static final String TOPIC = "TOPIC_DEV1";

    /**
     * 直接注入使用，用于发送消息到broker服务器
     */
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

	/**
     * 普通发送（这里的参数对象inDTO可以随意定义，可以发送个对象，也可以是字符串等）
     */
    public void send(MemberInDTO inDTO) {
        //":member"用于标识TOPIC下的不同分类标记
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
                .registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (src, typeOfSrc, context) -> new JsonPrimitive(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))))
                .registerTypeAdapter(LocalDate.class, (JsonSerializer<LocalDate>) (src, typeOfSrc, context) -> new JsonPrimitive(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))))
                .create();
        rocketMQTemplate.convertAndSend(TOPIC + ":member", gson.toJson(inDTO));
    }

//    /**
//     * 发送同步消息（阻塞当前线程，等待broker响应发送结果，这样不太容易丢失消息）
//     * （msgBody也可以是对象，sendResult为返回的发送结果）
//     */
//    public SendResult sendMsg(String msgBody) {
//        SendResult sendResult = rocketMQTemplate.syncSend(TOPIC, MessageBuilder.withPayload(msgBody).build());
//        log.info("【sendMsg】sendResult={}", JSON.toJSONString(sendResult));
//        return sendResult;
//    }
//
//	/**
//     * 发送异步消息（通过线程池执行发送到broker的消息任务，执行完后回调：在SendCallback中可处理相关成功失败时的逻辑）
//     * （适合对响应时间敏感的业务场景）
//     */
//    public void sendAsyncMsg(String msgBody) {
//        rocketMQTemplate.asyncSend(TOPIC, MessageBuilder.withPayload(msgBody).build(), new SendCallback() {
//            @Override
//            public void onSuccess(SendResult sendResult) {
//                // 处理消息发送成功逻辑
//            }
//            @Override
//            public void onException(Throwable throwable) {
//                // 处理消息发送异常逻辑
//            }
//        });
//    }
//
//	/**
//     * 发送延时消息（上面的发送同步消息，delayLevel的值就为0，因为不延时）
//     * 在start版本中 延时消息一共分为18个等级分别为：1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
//     */
//    public void sendDelayMsg(String msgBody, int delayLevel) {
//        rocketMQTemplate.syncSend(TOPIC, MessageBuilder.withPayload(msgBody).build(), messageTimeOut, delayLevel);
//    }
//
//    /**
//     * 发送单向消息（只负责发送消息，不等待应答，不关心发送结果，如日志）
//     */
//    public void sendOneWayMsg(String msgBody) {
//        rocketMQTemplate.sendOneWay(TOPIC, MessageBuilder.withPayload(msgBody).build());
//    }
//
//	/**
//     * 发送带tag的消息，直接在topic后面加上":tag"
//     */
//    public SendResult sendTagMsg(String msgBody) {
//        return rocketMQTemplate.syncSend(TOPIC + ":tag", MessageBuilder.withPayload(msgBody).build());
//    }
    
}
